package com.scoy.honeymei.base;

import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;

import com.scoy.honeymei.MeApp;

/**
 * @ClassName: BaseLazyFragment$
 * @Description:
 * @Author: GaoZhan
 * @CreateDate: 2019/8/26/0026$ 下午 15:59$
 * @UpdateUser: 更新者
 * @UpdateDate: 2019/8/26/0026$ 下午 15:59$
 * @UpdateRemark: 更新内容
 */
public abstract class BaseLazyFragment extends Fragment {

    /**
     * 若需要采用Lazy方式加载的Fragment，初始化内容放到initData实现
     * 若不需要Lazy加载则initData方法内留空,初始化内容放到initViews即可
     */

    private Context mContext;
    /**
     * 是否可见状态
     */
    private boolean isVisible;
    /**
     * 标志位，View已经初始化完成。
     */
    protected boolean isPrepared;
    /**
     * 是否第一次加载
     */
    protected boolean isFirstLoad = true;

    @Override
    public View onCreateView(LayoutInflater layoutInflater, ViewGroup viewGroup, Bundle savedInstanceState) {
        // 若 viewpager 不设置 setOffscreenPageLimit 或设置数量不够
        // 销毁的Fragment onCreateView 每次都会执行(但实体类没有从内存销毁)
        // 导致initData反复执行,所以这里注释掉
        // isFirstLoad = true;

        // 取消 isFirstLoad = true的注释 , 因为上述的initData本身就是应该执行的
        // onCreateView执行 证明被移出过FragmentManager initData确实要执行.
        // 如果这里有数据累加的Bug 请在initViews方法里初始化您的数据 比如 list.clear();

        mContext = getContext();

        isFirstLoad = true;
        View view = initViews(layoutInflater, viewGroup, savedInstanceState);
        initBind(view);
        isPrepared = true;
        lazyLoad();
        return view;
    }

    protected abstract View initViews(LayoutInflater layoutInflater, ViewGroup viewGroup, Bundle savedInstanceState);

    @Override
    public void onHiddenChanged(boolean hidden) {
        super.onHiddenChanged(hidden);
        if (!hidden) {
            isVisible = true;
            onVisible();
        } else {
            isVisible = false;
            onInvisible();
        }
    }

    protected void lazyLoad() {
        if (!isPrepared || !isVisible || !isFirstLoad) {
            return;
        }
        isFirstLoad = false;
        initData();
    }

    protected abstract void initBind(View view);

    protected abstract void initData();

    protected void onVisible() {
        lazyLoad();
    }

    protected void onInvisible() {
    }


    private FragmentActivity activity;

    /**
     * 获取activity
     *
     * @return this
     */
    public Context getContext() {
        if (activity == null) {
            return MeApp.getInstance();
        }
        return activity;
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        activity = getActivity();
    }
}
